﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Wrapper;

namespace WPF
{
    public partial class VueOrdrePassage : Window
    {
        // ATTRIBUTS
        WrapperJeu monWrapperJeu;
        ArrayList tabJoueurs;
        ArrayList resultatsLancerDes;
        int nbJoueurs;
        uint tour;

        public VueOrdrePassage(WrapperJeu wj, ArrayList tab)
        {
            // Initialisation des composants
            InitializeComponent();

            // Initialisation des attributs
            this.monWrapperJeu = wj;
            this.tabJoueurs = tab;
            this.resultatsLancerDes = new ArrayList();
            this.nbJoueurs = tab.Count;
            this.tour = 0;

            // Initialisation du composant ordre de passage
            initialiserGridOrdrePassage(nbJoueurs);
        }        

        public void initialiserGridOrdrePassage(int nb)
        {
            //Console.WriteLine("initialiserGridOrdrePassage()");
            switch (nb)
            {
                case 2:
                    this.gridOrdrePassageJ3.Visibility = System.Windows.Visibility.Hidden;
                    this.gridOrdrePassageJ4.Visibility = System.Windows.Visibility.Hidden;
                    CanvasDes.Margin = new System.Windows.Thickness(0, 111, 0, 66);
                    this.J21.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[0]).Key;
                    this.J22.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[1]).Key;
                    this.J21.Background = Brushes.BlueViolet;
                    break;
                case 3:
                    this.gridOrdrePassageJ2.Visibility = System.Windows.Visibility.Hidden;
                    this.gridOrdrePassageJ4.Visibility = System.Windows.Visibility.Hidden;
                    CanvasDes.Margin = new System.Windows.Thickness(0, 144, 0, 33);
                    this.J31.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[0]).Key;
                    this.J32.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[1]).Key;
                    this.J33.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[2]).Key;                    
                    this.J31.Background = Brushes.BlueViolet;
                    break;
                case 4:
                    this.gridOrdrePassageJ2.Visibility = System.Windows.Visibility.Hidden;
                    this.gridOrdrePassageJ3.Visibility = System.Windows.Visibility.Hidden;
                    this.J41.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[0]).Key;
                    this.J42.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[1]).Key;
                    this.J43.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[2]).Key;
                    this.J44.Content = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[3]).Key;
                    this.J41.Background = Brushes.BlueViolet;
                    break;
                default:
                    break;
            }
        }

        private void lancerDes(object sender, RoutedEventArgs e)
        {
            //Console.WriteLine("LancerDes()");
            uint de1, de2, res;
            string boxRes;

            // Lancement des dés
            do
            {
                de1 = monWrapperJeu.lancerDe();
                de2 = monWrapperJeu.lancerDe();
                res = de1 + de2;
            } while (resultatsLancerDes.Contains(res));
            
            // Si le résultat de lancé n'a jamais été obtenu par les joueurs précédents, alors on le sauvegarde dans un tableau
            resultatsLancerDes.Add(res);
            
            // Modification des images "de1" et "de2"
            this.de1.Source = new BitmapImage(new Uri(@"..\Images\face" + de1 + ".gif", UriKind.RelativeOrAbsolute));
            this.de2.Source = new BitmapImage(new Uri(@"..\Images\face" + de2 + ".gif", UriKind.RelativeOrAbsolute));
            
            // Affichage du résultat dans le textBox
            boxRes = "resJ" + nbJoueurs.ToString() + (++tour).ToString();
            ((TextBox)(this.FindName(boxRes))).Text = res.ToString();

            // Mise à jour du classement
            miseAJourClassement();

            if (tour == nbJoueurs)
            {
                // L'ordre de passage est défini, on doit ajouter (dans l'ordre) les joueurs dans le Jeu
                for (uint i = 0; i < nbJoueurs; i++)
                {
                    string boxNom = "J" + nbJoueurs.ToString() + (i + 1).ToString();
                    boxNom =  ((Label)(this.FindName(boxNom))).Content.ToString();
                    string boxClassement = "classementJ" + nbJoueurs.ToString() + (i + 1).ToString();
                    boxClassement =  ((TextBox)(this.FindName(boxClassement))).Text;
                    for (int j = 0; j < nbJoueurs; j++)
                    {
                        KeyValuePair<string, ArrayList> joueur = ((KeyValuePair<string, ArrayList>)this.tabJoueurs[j]);
                        if (joueur.Key == boxNom)
                        {
                            if (nbJoueurs == 2)
                            {
                                this.monWrapperJeu.addJoueur(joueur.Key, (string)joueur.Value[0], (string)joueur.Value[1], Convert.ToInt32(boxClassement) - 1);
                            }
                            else
                            {
                                this.monWrapperJeu.addJoueur(joueur.Key, (string)joueur.Value[0], Convert.ToInt32(boxClassement) - 1);
                            }
                            this.tabJoueurs.RemoveAt(j);
                            break;    
                        }
                    }
                }

                // Rendre visible le bouton permettant le passage à la vuePlateau
                this.BoutonLancerDes.Visibility = System.Windows.Visibility.Hidden;
                this.BoutonAllerVuePLateau.Visibility = System.Windows.Visibility.Visible;
                boxRes = "J" + nbJoueurs.ToString() + (tour).ToString();
                ((Label)(this.FindName(boxRes))).Background = Brushes.Transparent;
            }
            else
            {
                // Joueur suivant
                boxRes = "J" + nbJoueurs.ToString() + (tour).ToString();
                ((Label)(this.FindName(boxRes))).Background = Brushes.Transparent;
                boxRes = "J" + nbJoueurs.ToString() + (tour + 1).ToString();
                ((Label)(this.FindName(boxRes))).Background = Brushes.BlueViolet;
            }
        }

        public void miseAJourClassement()
        {
            //Console.WriteLine("miseAJourClassement()");

            // Trie du tableau contenant les résultats (dés)
            resultatsLancerDes.Sort();

            // C'est ici que se fait la mise à jour
            uint nbResultats = (uint)resultatsLancerDes.Count;
            for (uint i = 0; i < nbResultats; i++)
            {
                string boxRes = "resJ" + nbJoueurs.ToString() + (i + 1).ToString();
                TextBox tbRes = (TextBox)(this.FindName(boxRes));
                if (tbRes.Text != "")
                {
                    string boxClassement = "classementJ" + nbJoueurs.ToString() + (i + 1).ToString();
                    ((TextBox)(this.FindName(boxClassement))).Text = (nbResultats - (resultatsLancerDes.IndexOf(uint.Parse(tbRes.Text)))).ToString();
                }
            }
        }

        private void allerVuePlateau(object sender, RoutedEventArgs e)
        {
            VuePlateau vuePlateau = new VuePlateau(this.monWrapperJeu,this.nbJoueurs);
            vuePlateau.Left = this.Left;
            vuePlateau.Top = this.Top;
            vuePlateau.Show();
            this.Close();
        }
    }
}
